Amazon Connectを使ったCloudWatchアラームの電話通知で次の担当者への通知を番号入力で判定してみた
こんにちは。
繁松です。
はじめに
前回のブログでAmazon Connectを使ったCloudWatchアラームの電話通知について紹介しました。
前回は1つの電話番号にのみ通知を行う設定でしたが、今回は電話通知の際に次の担当者へ通知するかを選択できる構成を考えてみました。
Lambdaとコンタクトフローだけで完結する内容になっています。
アラート発報の架電時に「次の担当者に通知する場合は1を入力してください。」と案内し、1を入力した場合はリストの次の担当者に電話通知を行います。
最後の担当者の場合には次の担当者への通知は案内せずに、アラート内容だけ通知し終了します。
やってみた
前提条件
- Amazon Connect
- 構築済みであること
- 電話番号を取得済みであること
Amazon Connect
Amazon Connectコンタクトフローの作成
以下のようなフローを作成します。
①コンタクト属性を確認するブロック
Lambdaから受け取ったisFinalContactの値がtrueかを判定しています。
Lambdaではリストの最後にある番号の場合はisFinalContact:trueを返しています。
②顧客の入力を取得するブロック
CloudWatchアラーム名と次の担当者へ通知する場合は1を入力してくださいという案内を設定します。
オプションに1を設定し、1が入力された場合の分岐を設定します。
クラウドウォッチアラームの通知です。 $.Attributes.alarmName のアラームが発生しています。
次の担当者に通知する場合は1を入力してください。
③AWS Lambda関数を呼び出すブロック
この時点ではLambdaの作成が完了していないので、関数のARNは空のまま保存してください。
関数入力パラメータは、次の担当者に通知する際に必要となるalarmNameとcurrentIndexを設定します。
④プロンプトの再生ブロック
リストの最後にある番号の場合に分岐されるブロックです。
CloudWatchアラーム名の通知だけを読み上げるように設定します。
クラウドウォッチアラームの通知です。 $.Attributes.alarmName のアラームが発生しています。
Lambda
Lambda関数の作成
Python 3.12でLambdaを作成します。
ロールのポリシー追加
LambdaのロールにAmazon Connectの発信に必要な以下のポリシーを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "connect:StartOutboundVoiceContact",
"Resource": "*"
}
]
}
CloudWatchアラーム用のポリシー追加
LambdaにCloudWatchのリソースベースポリシーを追加します。
Lambda→アクセス権限→リソースベースのポリシーステートメントで「アクセス権限を追加」を選択します。
以下の値を入力し保存します。
ステートメントID:任意の値
プリンシパル:lambda.alarms.cloudwatch.amazonaws.com
アクション:lambda:InvokeFunction
コード
Amazon ConnectのインスタンスID、コンタクトフローID、Amazon Connectで取得した電話番号、通知先の電話番号を設定します。
電話番号は「E.164」形式(例:+815011111111)を設定する必要があります。
今回「EC2_CPU使用率80%超過」というアラート名を読み上げて通知したいのですが、EC2を「イーシー二」と呼んでしまうのでコードの中で「イーシーツー」に変換しています。
import json
import boto3
def lambda_handler(event, context):
connect = boto3.client('connect')
instance_id = 'Amazon ConnectインスタンスID'
contact_flow_id = 'コンタクトフローID'
source_phone_number = 'Amazon Connectで取得した電話番号'
# 担当者リスト(順番に呼び出す)
phone_numbers = ['通知先の電話番号1', '通知先の電話番号2', '通知先の電話番号3']
# イベントから現在の担当者のインデックスを取得
current_index = int(event.get('Details', {}).get('Parameters', {}).get('currentIndex', 0))
# アラーム名を取得
if 'alarmData' in event:
alarmName = event['alarmData']['alarmName']
alarmName_replace = alarmName.replace("EC2", "イーシーツー")
else:
alarmName_replace = event['Details']['Parameters'].get('alarmName', '')
# リストの最後の番号か判定
is_final_contact = 'true' if current_index == len(phone_numbers) - 1 else 'false'
# 担当者に電話をかける
destination_phone_number = phone_numbers[current_index]
response = connect.start_outbound_voice_contact(
DestinationPhoneNumber=destination_phone_number,
ContactFlowId=contact_flow_id,
InstanceId=instance_id,
SourcePhoneNumber=source_phone_number,
Attributes={
'alarmName': alarmName_replace,
'currentIndex': str(current_index + 1), # 次の担当者のインデックス
'isFinalContact': is_final_contact
}
)
通知先の電話番号を携帯電話宛(070,080,090)に設定したい場合はAWSサポートへの申請が必要になります。
Amazon Connect
Lambda関数の追加
作成したLambda関数をAmazon Connectに追加します。
AWSコンソール→Amazon Connect(対象のインスタンス)→問い合わせフローを開きます。
AWS Lambdaの項目で作成したLambda関数を選択し「+Add Lambda Function」を選択します。
コンタクトフローのLambdaブロックに設定
先ほどの手順で関数のARNを空で保存した「AWS Lambda関数を呼び出す」ブロックを開き、追加したLambda関数を設定します。
CloudWatch
CloudWatch Alarmの作成
EC2のCPU使用率が80%を超えた場合のアクションに電話通知用のLambdaを設定してみます。
Lambdaアクションに先ほど作成した関数を設定します。
アラーム名に「EC2_CPU使用率80%超過」を設定します。
動作確認
動作確認のためAmazon Connect宛に電話通知を行いました。
動画では頭の方の音声が途切れていますが、携帯宛の通知ではちゃんと「EC2 CPU使用率超過のアラームが発生しています。」と設定した内容が聞こえています。
さいごに
Amazon ConnectとLambdaを使用して、複数の担当者に順番に通知を行う方法を紹介しました。
今回はリストの次の担当者に通知を飛ばすように設定しましたが、決められた番号の担当者に通知を飛ばすような設定も可能です。